// #include <Arduino.h>
// #include <WiFi.h>
// #include <ArduinoJson.h>
// #include <GxEPD2_BW.h>
// #include <GxEPD2_3C.h>
// #include "GxEPD2_370C_UC8253.h"
// #include <U8g2_for_Adafruit_GFX.h>
// #include <time.h>

// // ===================== 屏幕设置 =====================
// #define EPD2_COLOR GxEPD2_3C
// #define EPD2_MODE GxEPD2_370C_UC8253
// EPD2_COLOR<EPD2_MODE, EPD2_MODE::HEIGHT> display(
//     EPD2_MODE(/*CS=*/5, /*DC=*/17, /*RST=*/16, /*BUSY=*/19));
// U8G2_FOR_ADAFRUIT_GFX u8g2Fonts;

// // ===================== WiFi =====================
// const char *ssid = "helloworld";
// const char *password = "12345678";

// // ===================== TCP 设置 =====================
// const char *TCP_HOST = "192.168.0.106"; // Python TCP 服务 IP
// const uint16_t TCP_PORT = 5002;

// // ===================== 更新间隔 =====================
// const unsigned long UPDATE_INTERVAL_MINUTES = 5; // 更新间隔 5 分钟
// const unsigned long UPDATE_INTERVAL_MS = UPDATE_INTERVAL_MINUTES * 60UL * 1000UL; // 转成毫秒

// unsigned long lastTimeUpdate = 0;
// const unsigned long TIME_REFRESH_INTERVAL = 50; // 50ms刷新一次


// // ===================== 数据结构 =====================
// struct LunarData
// {
//   /** 农历月份名称 */
//   String lmonthname = "八月";
//   /** 农历日期名称 */
//   String lunarday = "初一";
//   /** 公历日期 */
//   String gregoriandate = "2025-10-03";
//   /** 农历节日 */
//   String festival = "无";
// };

// struct WeatherData
// {
//   String text = "多云";              // 当前天气文字描述
//   String tempToday = "25°C/30°C";    // 今天温度范围
//   String tempTomorrow = "26°C/31°C"; // 明天温度范围
//   String temperatureNextHours[12] = {
//       "25°C", "25°C", "24°C", "24°C",
//       "23°C", "23°C", "23°C", "22°C",
//       "22°C", "22°C", "22°C", "22°C"}; // 未来12小时温度
//   String tips[3] = {
//       "感冒指数: 较易发 (湿度大，较易感冒)",
//       "运动指数: 较不宜 (有降水，推荐您在室内进行休闲运动。)",
//       "穿衣指数: 热 (适合穿T恤、短薄外套等夏季服装。)"}; // 感冒/运动/穿衣指数三行
// };
// /**
//  * 农历数据
//  */
// LunarData lunar;
// /**
//  * 天气数据
//  */
// WeatherData weather;

// // ===================== 函数声明 =====================
// void fetchDataTCP();
// void updateDisplay();
// void syncTime();
// int drawWrappedText(U8G2_FOR_ADAFRUIT_GFX &u8g2, int x, int y, String text, int maxChars, int lineHeight);

// // ===================== setup =====================
// void inkSetup2()
// {
//   Serial.begin(115200);
//   Serial.println("\n初始化墨水屏...");

//   // 初始化屏幕
//   display.init();
//   //----------------------傻比驱动bug，每次上电都会转动 而不是固定方向---fix：写两次旋转修复
//   display.setRotation(3);
//   display.setRotation(3);
//   //----------------------傻比驱动bug，每次上电都会转动 而不是固定方向---fix：写两次旋转修复
//   u8g2Fonts.begin(display);
//   u8g2Fonts.setFontMode(1);
//   u8g2Fonts.setFontDirection(0);

//   // 连接 WiFi
//   WiFi.begin(ssid, password);
//   Serial.print("连接 WiFi...");
//   while (WiFi.status() != WL_CONNECTED)
//   {
//     delay(500);
//     Serial.print(".");
//   }
//   Serial.println("\nWiFi 已连接: " + String(WiFi.localIP()));
//   syncTime();
//   //  第一次获取数据并显示
//   fetchDataTCP();
//   updateDisplay();
// }

// // ===================== loop =====================
// unsigned long lastUpdate = 0;
// void inkLoop2()
// {
//    if (millis() - lastUpdate > UPDATE_INTERVAL_MS)
//   { // 每5分钟更新一次
//     lastUpdate = millis();
//     if (WiFi.status() != WL_CONNECTED)
//       WiFi.reconnect();
//     syncTime();
//     fetchDataTCP();
//     display.init();
//     //----------------------傻比驱动bug，每次上电都会转动 而不是固定方向---fix：写两次旋转修复
//     display.setRotation(3);
//     display.setRotation(3);
//     //----------------------傻比驱动bug，每次上电都会转动 而不是固定方向---fix：写两次旋转修复
//     u8g2Fonts.begin(display);
//     u8g2Fonts.setFontMode(1);
//     u8g2Fonts.setFontDirection(0);
//     updateDisplay();
//   }
// }

// // ===================== NTP 同步 =====================
// void syncTime()
// {
//   configTime(8 * 3600, 0, "ntp1.aliyun.com", "ntp2.aliyun.com");
//   Serial.print("等待时间同步");
//   time_t now = time(nullptr);
//   while (now < 24 * 3600)
//   {
//     delay(500);
//     Serial.print(".");
//     now = time(nullptr);
//   }
//   Serial.println("\n时间已同步: " + String(ctime(&now)));
// }

// // ===================== TCP 获取数据 =====================
// void fetchDataTCP()
// {
//   if (WiFi.status() != WL_CONNECTED)
//     return;

//   WiFiClient client;
//   if (!client.connect(TCP_HOST, TCP_PORT))
//   {
//     Serial.println("TCP 连接失败");
//     return;
//   }
//   Serial.println("TCP 已连接，等待数据...");

//   String payload;
//   unsigned long start = millis();
//     while (millis() - start < 600000)
// //  while (millis() - start < 100)
//   {
//     while (client.available())
//     {
//       payload += (char)client.read();
//     }
//     if (payload.length() > 0)
//       break;
//     delay(5);
//   }
//   client.stop();

//   if (payload.length() == 0)
//   {
//     Serial.println("未收到数据");
//     return;
//   }
//   Serial.println("收到数据");
//   Serial.println(payload);

//   DynamicJsonDocument doc(32 * 1024);
//   if (deserializeJson(doc, payload))
//   {
//     Serial.println("解析 JSON 失败");
//     return;
//   }

//   JsonObject w = doc["weather"];
//   weather.text = w["text"] | "";

//   // ---------------- 今天温度 ----------------
//   JsonArray forecasts = doc["result"]["forecasts"];
//   if (forecasts.size() > 0)
//   {
//     int tmin = forecasts[0]["low"] | 0;
//     int tmax = forecasts[0]["high"] | 0;
//     weather.tempToday = String(tmin) + "°C/" + String(tmax) + "°C";
//   }

//   // ---------------- 明天温度 ----------------
//   if (forecasts.size() > 1)
//   {
//     int tmin = forecasts[1]["low"] | 0;
//     int tmax = forecasts[1]["high"] | 0;
//     weather.tempTomorrow = String(tmin) + "°C/" + String(tmax) + "°C";
//   }

//   // ---------------- 未来12小时温度 ----------------
//   JsonArray forecast_hours = w["temperatureNext12Hours"];
//   for (int i = 0; i < 12; i++)
//   {
//     if (i < forecast_hours.size())
//     {
//       weather.temperatureNextHours[i] = forecast_hours[i].as<String>();
//     }
//     else
//     {
//       weather.temperatureNextHours[i] = "--";
//     }
//   }

//   // ---------------- 指数提示 ----------------
//   JsonArray tipsArr = w["tips"];
//   for (int i = 0; i < 3; i++)
//   {
//     if (i < tipsArr.size())
//     {
//       weather.tips[i] = tipsArr[i].as<String>();
//     }
//     else
//     {
//       weather.tips[i] = "";
//     }
//   }
// }
// // ===================== 计算并换行 =====================
// /**
//  * drawWrappedText - 在指定宽度范围内自动换行绘制文字
//  *
//  * @param u8g2      : U8G2_FOR_ADAFRUIT_GFX 对象
//  * @param x         : 起始 x 坐标
//  * @param y         : 起始 y 坐标（基线）
//  * @param text      : 要绘制的字符串
//  * @param maxChars  : 每行最大字符数（中文可粗略估计）
//  * @param lineHeight: 行高像素
//  *
//  * 返回值：返回行数
//  */
// int drawWrappedText(U8G2_FOR_ADAFRUIT_GFX &u8g2, int x, int y, String text, int maxChars, int lineHeight)
// {
//   int start = 0;
//   int textLength = text.length();
//   int currentY = y;
//   int lines = 0;
//   while (start < textLength)
//   {
//     int len = min(maxChars, textLength - start);
//     String line = text.substring(start, start + len);
//     u8g2.setCursor(x, currentY);
//     u8g2.print(line);
//     currentY += lineHeight;
//     start += len;
//     lines++; // 记录行数
//   }

//   return lines; // 返回行数
// }



// // ===================== 墨水屏显示 =====================
// void updateDisplay()
// {
//   display.setFullWindow();
//   display.firstPage();
//   do
//   {
//     display.fillScreen(GxEPD_WHITE);
//     u8g2Fonts.setBackgroundColor(GxEPD_WHITE);

//     // 左侧年月日小时
//     int leftX = 10, cursorY = 40;
//     u8g2Fonts.setFont(u8g2_font_logisoso24_tn);
//     u8g2Fonts.setCursor(leftX, cursorY);
//     u8g2Fonts.setForegroundColor(GxEPD_BLACK);
//     u8g2Fonts.print(lunar.gregoriandate.substring(0, 7));
//     // 左侧日
//     cursorY += 90;
//     u8g2Fonts.setFont(u8g2_font_logisoso62_tn);
//     u8g2Fonts.setCursor(leftX, cursorY);
//     u8g2Fonts.setForegroundColor(GxEPD_RED);
//     u8g2Fonts.print(lunar.gregoriandate.substring(8, 10));
//     u8g2Fonts.setForegroundColor(GxEPD_BLACK);
//     // 右侧天气
//     int wx = 140, wy = 30;
//     u8g2Fonts.setFont(u8g2_font_wqy12_t_gb2312a);
//     u8g2Fonts.setCursor(wx, wy);
//     u8g2Fonts.print(weather.text);
//     u8g2Fonts.setCursor(wx, wy + 20);
//     u8g2Fonts.print("今天: " + weather.tempToday);
//     u8g2Fonts.setCursor(wx, wy + 40);
//     u8g2Fonts.print("明天: " + weather.tempTomorrow);

//     // ---------------- 指数提示 ----------------
//     int indexStartY = wy + 70; // 第一个指数的起始 y
//     for (int i = 0; i < 3; i++)
//     {
//       u8g2Fonts.setForegroundColor(GxEPD_RED);
//       u8g2Fonts.setFont(u8g2_font_wqy15_t_gb2312);
//       int lines = drawWrappedText(u8g2Fonts, wx, indexStartY, weather.tips[i], 55, 15);
//       // 下一条指数的起始 y
//       indexStartY += lines * 15 + 10;
//     }

//     u8g2Fonts.setForegroundColor(GxEPD_BLACK);

//     // 获取当前小时
//     time_t now = time(nullptr);
//     struct tm *now_tm = localtime(&now);
//     int currentHour = now_tm->tm_hour;

//     // 未来12小时温度
//     int startX = 10, startY = 210, stepX = 35;
//     u8g2Fonts.setFont(u8g2_font_wqy12_t_gb2312a);

//     for (int i = 0; i < 12; i++)
//     {
//       int hour = (currentHour + i + 1) % 24; // 当前时间 + i 小时，取24小时制
//       u8g2Fonts.setCursor(startX + stepX * i, startY);
//       u8g2Fonts.print(String(hour) + "点"); // 显示具体小时

//       u8g2Fonts.setCursor(startX + stepX * i, startY + 18);
//       u8g2Fonts.print(weather.temperatureNextHours[i]); // 温度
//     }

//   } while (display.nextPage());
// }
